package com.demo.bookstore.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;

/**
 *   说明:
 *        该BaseServlet中 抽取了doGet/doPost方法
 *        以后其它的Servlet只需要继承该类  就可以得到其中的方法 包括反射机制
 *        其中的this 代表用户调用的真实的Servlet  通过url地址调用 真实的Servlet实例化对象
 *
 * @author apple
 */
public class BaseServlet extends ViewBaseServlet {

    private static final String METHOD = "method";

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决post请求乱码问题
        req.setCharacterEncoding("utf-8");
        //解决不走模版引擎的乱码问题
        resp.setContentType("text/html;charset=UTF-8");

        //1.获取用户的方法名称
        String method = req.getParameter(METHOD);
        //2.获取当前对象的类型
        try {
            Method declaredMethod = this.getClass().getDeclaredMethod(method, HttpServletRequest.class, HttpServletResponse.class);
            // 暴力反射
            declaredMethod.setAccessible(true);
            //3.调用方法  一般情况下 都是对象.方法(参数)
            declaredMethod.invoke(this,req,resp);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("~~~~~~请检查method的方法名称是否匹配!!!!!!");
            throw new RuntimeException(e);
        }
    }
}
